/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 言初
 * Date: 2023-12-25
 * Time: 22:21
 */
//动态规划
//输出装入背包中物品的最大总价值
//没有对背包必须装满做要求
//对于每一个物品就是都有2种可能性，加入背包和不加入背包
import java.util.*;
public class Main15 {
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int c=sc.nextInt();
        int[] arrc=new int[n+1];
        int[] arrv=new int[n+1];

        for(int i=1;i<=n;i++){
            arrc[i]=sc.nextInt();
            arrv[i]=sc.nextInt();
        }

        int ret=func(n,c,arrc,arrv);
        System.out.println(ret);
    }

    public static int func(int n,int c, int[] arrc, int[] arrv){
        int[][] dp=new int[n+1][c+1];
        //i 表示到第几个物品，j表示此时背包的容量
        for(int i=1;i<=n;i++){
            for(int j=1;j<=c;j++){
                //不装入背包
                int a=dp[i-1][j];
                //装入背包
                int b=0;
                if(j-arrc[i]>=0){
                    b=dp[i-1][j-arrc[i]] + arrv[i];
                }

                dp[i][j]=a>b?a:b;
            }
        }

        return dp[n][c];
    }
}

